// 文件：Assets/Scripts/UnityJsonHelper.cs
using System;
using System.IO;
using System.Text.RegularExpressions;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

/// <summary>
/// Unity JSON 辅助类：
/// - 使用 JsonUtility 进行序列化/反序列化
/// - 自动过滤掉空字符串（""）和空数组（[]）字段
/// </summary>
public static class UnityJsonHelper
{
    /// <summary>
    /// 将对象序列化为 JSON 字符串，并过滤空串和空集合字段。
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="obj">要序列化的对象</param>
    /// <param name="prettyPrint">是否格式化输出</param>
    /// <returns>处理后的 JSON 字符串</returns>
    public static string ToJson<T>(T obj, bool prettyPrint = false)
    {
        // 1. 使用 Unity 官方序列化
        string json = JsonUtility.ToJson(obj, prettyPrint);

        // 2. 过滤所有空字符串字段："\"FieldName\":\"\","
        json = Regex.Replace(json, "\"\\w+\":\"\",\\s*", string.Empty);

        // 3. 过滤所有空数组字段："\"FieldName\":[],"
        json = Regex.Replace(json, "\"\\w+\":\\[\\],\\s*", string.Empty);

        // 4. 清理最后一个属性后可能残留的多余逗号，例如 {...,}
        json = Regex.Replace(json, ",(\\s*[}\\]])", "$1");

        return json;
    }

    /// <summary>
    /// 将 JSON 字符串反序列化为对象。
    /// </summary>
    public static T FromJson<T>(string json)
    {
        return JsonUtility.FromJson<T>(json);
    }

    /// <summary>
    /// 将对象序列化并写入文件（自动创建目录，刷新 AssetDatabase）。
    /// </summary>
    /// <param name="obj">要序列化的对象</param>
    /// <param name="path">文件路径（包括文件名）</param>
    /// <param name="prettyPrint">是否格式化输出</param>
    public static void ToJsonFile<T>(T obj, string path, bool prettyPrint = true)
    {
        string json = ToJson(obj, prettyPrint);

        // 确保目录存在
        string dir = Path.GetDirectoryName(path);
        if (!Directory.Exists(dir))
            Directory.CreateDirectory(dir);

        File.WriteAllText(path, json);

        // 在编辑器模式下刷新
        #if UNITY_EDITOR
        AssetDatabase.Refresh();
        #endif
    }

    /// <summary>
    /// 从文件读取 JSON 并反序列化为对象。
    /// </summary>
    /// <typeparam name="T">目标类型</typeparam>
    /// <param name="path">文件路径</param>
    public static T FromJsonFile<T>(string path)
    {
        if (!File.Exists(path))
            throw new FileNotFoundException($"JSON 文件未找到：{path}");

        string json = File.ReadAllText(path);
        return FromJson<T>(json);
    }
}